<!--
 * @Descripttion: 图标选择器组件
 * @version: 2.0
 * @Author: sakuya
 * @Date: 2021年7月27日10:02:46
 * @LastEditors: sakuya
 * @LastEditTime: 2022年6月6日13:48:49
-->

<template>
	<div class="sc-icon-select">
		<div class="sc-icon-select__wrapper" :class="{ 'hasValue': value }" @click="open">
			<el-input :prefix-icon="value || 'el-icon-plus'" v-model="value" :disabled="disabled" readonly></el-input>
		</div>
		<el-dialog title="图标选择器" v-model="dialogVisible" :width="760" destroy-on-close append-to-body>
			<div class="sc-icon-select__dialog" style="margin: -20px 0 -10px 0;">
				<el-form :rules="{}">
					<el-form-item prop="searchText">
						<el-input class="sc-icon-select__search-input" prefix-icon="el-icon-search" v-model="searchText"
							placeholder="搜索" size="large" clearable />
					</el-form-item>
				</el-form>
				<el-tabs>
					<el-tab-pane v-for="item in data" :key="item.name" lazy>
						<template #label>
							{{ item.name }} <el-tag size="small" type="info">{{ item.icons.length }}</el-tag>
						</template>
						<div class="sc-icon-select__list">
							<el-scrollbar>
								<ul @click="selectIcon">
									<el-empty v-if="item.icons.length == 0" :image-size="100" description="未查询到相关图标" />
									<li v-for="icon in item.icons" :key="icon">
										<span :data-icon="icon"></span>
										<el-icon>
											<component :is="icon" />
										</el-icon>
									</li>
								</ul>
							</el-scrollbar>
						</div>
					</el-tab-pane>
				</el-tabs>
			</div>
			<template #footer>
				<el-button @click="clear" text>清除</el-button>
				<el-button @click="dialogVisible = false">取消</el-button>
			</template>
		</el-dialog>
	</div>
</template>

<script>
import config from "@renderer/config/iconSelect"

export default {
	props: {
		modelValue: { type: String, default: "" },
		disabled: { type: Boolean, default: false },
	},
	data() {
		return {
			value: "",
			dialogVisible: false,
			data: [],
			searchText: ""
		}
	},
	watch: {
		modelValue(val) {
			this.value = val
		},
		value(val) {
			this.$emit('update:modelValue', val)
		},
		searchText(val) {
			this.search(val)
		}
	},
	mounted() {
		this.value = this.modelValue
		this.data.push(...config.icons)
	},
	methods: {
		open() {
			if (this.disabled) {
				return false
			}
			this.dialogVisible = true
		},
		selectIcon(e) {
			if (e.target.tagName != 'SPAN') {
				return false
			}
			this.value = e.target.dataset.icon
			this.dialogVisible = false
		},
		clear() {
			this.value = ""
			this.dialogVisible = false
		},
		search(text) {
			if (text) {
				const filterData = JSON.parse(JSON.stringify(config.icons))
				filterData.forEach(t => {
					t.icons = t.icons.filter(n => n.includes(text))
				})
				this.data = filterData
			} else {
				this.data = JSON.parse(JSON.stringify(config.icons))
			}
		}
	}
}
</script>

<style scoped>
.sc-icon-select {
	display: inline-flex;
}

.sc-icon-select__wrapper {
	cursor: pointer;
	display: inline-flex;
}

.sc-icon-select__wrapper:deep(.el-input__wrapper).is-focus {
	box-shadow: 0 0 0 1px var(--el-input-hover-border-color) inset;
}

.sc-icon-select__wrapper:deep(.el-input__inner) {
	flex-grow: 0;
	width: 0;
}

.sc-icon-select__wrapper:deep(.el-input__icon) {
	margin: 0;
	font-size: 16px;
}

.sc-icon-select__wrapper.hasValue:deep(.el-input__icon) {
	color: var(--el-text-color-regular);
}

.sc-icon-select__list {
	height: 270px;
	overflow: auto;
}

.sc-icon-select__list ul {}

.sc-icon-select__list li {
	display: inline-block;
	width: 80px;
	height: 80px;
	margin: 5px;
	vertical-align: top;
	transition: all 0.1s;
	border-radius: 4px;
	position: relative;
}

.sc-icon-select__list li span {
	position: absolute;
	top: 0;
	left: 0;
	right: 0;
	bottom: 0;
	z-index: 1;
	cursor: pointer;
}

.sc-icon-select__list li i {
	display: inline-block;
	width: 100%;
	height: 100%;
	font-size: 26px;
	color: #6d7882;
	display: flex;
	justify-content: center;
	align-items: center;
	border-radius: 4px;
}

.sc-icon-select__list li:hover {
	box-shadow: 0 0 1px 4px var(--el-color-primary);
	background: var(--el-color-primary-light-9);
}

.sc-icon-select__list li:hover i {
	color: var(--el-color-primary);
}</style>
